#include "thingsdao.h"
#include <QDebug>
ThingsDao::ThingsDao(QString hostName,QString dbName,QString username,QString password,QString tableName)
{
    db=QSqlDatabase::addDatabase("QSQLITE");
    /*设置数据库的相关参数*/
    db.setHostName(hostName);
    db.setDatabaseName(dbName);
    db.setUserName(username);
    db.setPassword(password);
    if(db.open())//如果数据库成功打开
    {
        qDebug()<<"数据库成功开启"; //打印调试信息
        QSqlQuery query(db);//新建一个查询
        query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg(tableName));
        if(query.next()&&query.value(0).toInt()!=0)//如果表已经存在
        {
            qDebug()<<"表已存在";//调试信息
        }
        else//否则
        {
            qDebug()<<"数据表"<<tableName<<"不存在";
            //创建表  数据库中的id、名称、添加时间、结束时间、状态
            bool success=query.exec(QString("create table %1(db_id int,name varchar,add_time varchar,end_time varchar,status int)").arg(tableName));
            if(success)
            {
                qDebug()<<"建表成功";
            }
            else
            {
                QSqlError error=query.lastError();
                qDebug()<<"建表失败"<<error;
            }
        }
        this->tableName=tableName;
    }
    else
    {
        qDebug()<<"database failed to open";    //打印调试信息
    }
}

int ThingsDao::insertItem(QString name,QDateTime endTime)
{
    bool success;   //是否成功
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建一个查询
    query.prepare(QString("insert into %1 values(0,?,?,?,0)").arg(tableName));  //预处理语句，数据库中id设置为0,状态设置为0
    query.bindValue(0,name);    //设置名称
    query.bindValue(1,QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));    //设置当前时间为添加时间
    query.bindValue(2,endTime.toString("yyyy-MM-dd hh:mm:ss")); //设置截止时间
    qDebug()<<query.lastQuery();    //打印语句
    success=query.exec();   //执行并获取结果
    if(success) //如果执行成功
    {
        query.exec(QString("select max(rowid) from %1").arg(tableName));    //查找表中最后一条数据
        if(query.next())
            return query.value(0).toInt();
        return -1;
    }
    else
    {
        return -1;
    }
}

QList<ThingsDao::ThingData> ThingsDao::queryItem()
{
    QList<ThingData> itemdatas;  //新建一个结构体列表
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建一个查询
    query.exec(QString("select rowid,name,end_time from %1 where status=0").arg(tableName)); //查询status为0的名称、截止时间
    while(query.next())
    {
        ThingData item;  //声明一个结构体
        item.id=query.value(0).toInt(); //放置id
        item.name=query.value(1).toString(); //放置名称
        item.endTime=query.value(2).toString(); //放置截止时间
        itemdatas.append(item); //添加到列表中
    }
    return itemdatas;   //返回查询结果
}

bool ThingsDao::setItemStatus(int id, int result)
{
    bool ok;
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建查询语句
    ok=query.exec(QString("update %1 set status=%2 where rowid=%3").arg(tableName).arg(result).arg(id)); //将表名中的status字段修改
    return ok;
}

QJsonArray ThingsDao::getThingArray()
{
    //QList<ThingData> itemdatas;  //新建一个结构体列表
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建一个查询
    query.exec(QString("select rowid,name,add_time,end_time,status from %1 where db_id=0 and status=0").arg(tableName)); //查询status为0的名称、截止时间
    QJsonArray array;
    while(query.next())
    {
        QJsonObject json;
        json.insert("localId",query.value(0).toInt());
        json.insert("name",query.value(1).toString());
        json.insert("addTime",query.value(2).toString());
        json.insert("endTime",query.value(3).toString());
        json.insert("status",query.value(4).toInt());
        array.append(json);
    }
    return array;
//    QJsonDocument document;
//    document.setArray(array);
//    QByteArray byteArray = document.toJson(QJsonDocument::Compact);
//    QString strJson(byteArray);
//    return strJson;
}

void ThingsDao::updateDbId(QJsonArray array)
{
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    for(int i=0;i<array.size();i++) //遍历数组
    {
        QSqlQuery query(db);    //新建一个查询
        QJsonDocument document;
        QJsonObject object=array[i].toObject();
        query.prepare(QString("update %1 set db_id=? where rowid=?").arg(tableName));   //更新
        query.bindValue(0,object["dbId"].toInt());  //绑定数据库id
        query.bindValue(1,object["localId"].toInt());   //绑定本地id
        qDebug()<<query.lastQuery();    //打印语句
        query.exec();
    }
}

int ThingsDao::getStatus(int dbId)
{
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建一个查询
    query.exec(QString("select status from %1 where db_id=%2").arg(tableName).arg(dbId)); //查询dbId对应数据的状态
    if(!query.next())   //如果没有数据
    {
        return 0;
    }
    if(query.value(0).toInt()==0||query.value(0).toInt()==3)   //如果未完成或者已经同步过
    {
        return 1;
    }
    if(query.value(0).toInt()==1||query.value(0).toInt()==2)    //如果已经完成但是没有和服务器同步
    {
        return 2;
    }
    //如果状态为3，说明已经和远程服务器同步过了，所以不用处理
    return 0;
}

QJsonArray ThingsDao::saveAndRetDelList(QJsonArray array)
{
    QJsonArray deleteList;  //删除列表
    for(int i=0;i<array.size();i++) //遍历数组
    {
        QJsonObject object=array[i].toObject(); //获取每一个对象
        int status=getStatus(object["id"].toInt()); //获取状态
        if(status==0)  //如果不存在
        {
            db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
            QSqlQuery query(db);    //新建一个查询
            query.prepare(QString("insert into %1 values(?,?,?,?,0)").arg(tableName));  //预处理语句，数据库中id设置为0,状态设置为0
            query.bindValue(0,object["id"].toInt());  //设置数据库id
            query.bindValue(1,object["name"].toString());    //设置名称
            query.bindValue(2,object["addTime"].toString());    //设置时间
            query.bindValue(3,object["endTime"].toString()); //设置截止时间
            qDebug()<<query.lastQuery();    //打印语句
            int success=query.exec();   //执行并获取结果
            if(!success)    //如果失败
            {
                return QJsonArray();  //返回空列表
            }
        }
        if(status==2)   //如果存在并且完成了，而且没有和服务器同步过
        {
            //将id添加到删除列表中
            deleteList.append(object["id"].toInt());
        }
    }
    return deleteList;  //返回删除列表
}

void ThingsDao::syncDelThing(QJsonArray array)
{
    for(int i=0;i<array.size();i++) //遍历数组
    {
        int dbId=array[i].toInt(); //获取数据库id
        db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
        QSqlQuery query(db);    //新建查询语句
        query.exec(QString("update %1 set status=3 where db_id=%2").arg(tableName).arg(dbId)); //将表名中的status字段修改
    }
}

QJsonArray ThingsDao::getDelThings()
{
    db=QSqlDatabase::database(QSqlDatabase::defaultConnection,true);    //连接到数据库
    QSqlQuery query(db);    //新建一个查询
    query.exec(QString("select db_id from %1 where status=1 or status=2").arg(tableName)); //查询dbId对应数据的状态
    QJsonArray array;   //新建数组
    while(query.next())
    {
        int dbId=query.value(0).toInt();
        if(dbId!=0) //如果不是没有同步过的事件
            array.append(dbId);   //添加id进去
    }
    return array;   //返回数组
}
